package br.edu.unibratec.lancenet;

import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import android.app.ListActivity;
import android.widget.ArrayAdapter;

/**
 * Classe respons�vel por baixar um conte�do RSS
 * 
 * @author Daniel, Esdras, Naftali.
 *
 */
public class LeitorRSSActivity extends ListActivity {

	List<PostLance> news;
	ArrayAdapter<PostLance> adapter;
	
	/**
	 * Estabelece a conex�o com o RSS e solicita a leitura dos dados.
	 * 
	 * @param rss URL das noticias.
	 * @return Lista de not�cias
	 * @throws Exception repassa a excess�o para quem solicitou as not�cias.
	 */
	public static List<PostLance> retrievePosts(String rss) throws Exception {
		
		// Cria a URL
		URL url = new URL(rss);
		// Abre a conex�o
		HttpURLConnection conexao = (HttpURLConnection)url.openConnection();
		// Define o m�todo do request.
		conexao.setRequestMethod("GET");
		// Define o tempo limite de leitura do HTML
		conexao.setReadTimeout(10000);
		// Define o tempo limite para conex�o.
		conexao.setConnectTimeout(15000);
		// 
		conexao.setDoInput(true);
		
		conexao.connect();
		
		if (conexao.getResponseCode() == 200){ // HTTP_OK
			return readXML(conexao.getInputStream());
		}
		return null;
	}

	/**
	 * Metodo que efetua o Parser do inputStream (fluxo de entrada) para um XML,
	 * e efetua a leitura e atribui cada n� � um objeto que representa a noticia.
	 * 
	 * Cada n� ser� adicionado � lista de not�cias.
	 * 
	 * @param is inputStream.
	 * @return Lista de not�cias.
	 */
	private static List<PostLance> readXML(InputStream is) {
		List<PostLance> noticias = new ArrayList<PostLance>();

		try {
			// Criando os objetos que representam o XML
			DocumentBuilderFactory factory = DocumentBuilderFactory
					.newInstance();

			DocumentBuilder builder = factory.newDocumentBuilder();
			Document xmlDocument = builder.parse(is);

			// Cada noticia � representada pela tag <item>
			// Aqui obtemos a lista de n�s com essa tag
			NodeList posts = xmlDocument.getElementsByTagName("item");

			// Vamos iterar sobre a lista de itens
			String title = null, link = null, descricao = null, enclosure = null;

			for (int i = 0; i < posts.getLength(); i++) {
				Node post = posts.item(i);

				// Cada n� ITEM tem os filhos:
				// TITLE, LINK, DESCRIPTION, PUBDATE, ENCLOSURE
				NodeList postInfo = post.getChildNodes();
				for (int j = 0; j < postInfo.getLength(); j++) {
					Node info = postInfo.item(j);

					if ("title".equals(info.getNodeName())) {
						title = info.getTextContent();

					} else if ("link".equals(info.getNodeName())) {
						link = info.getTextContent();

					} else if ("descricao".equals(info.getNodeName())) {
						
						descricao = info.getTextContent();	
						
					} else if ("enclosure".equals(info.getNodeName())) {
						
						enclosure = info.getAttributes().getNamedItem("url").getTextContent();	
					}
				}
				// Com as informacoes das tags, criamos o
				// objeto noticia e adicionamos na lista
				noticias.add(new PostLance(title, link, descricao, enclosure));
			}
		} catch (Throwable e) {
			e.printStackTrace();
		}
		return noticias;
	}
}